// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.util.ArrayList;
// import java.util.List;

#include "SQLUnionDataType.h"
#include "../visitor/SQLASTVisitor.h"
#include "../../utils/listTran.h"

SQLUnionDataType::SQLUnionDataType()
{
  items = std::make_shared<std::list<SQLDataType_ptr>>();
}
// @Override
string_ptr SQLUnionDataType::getName()
{
  return make_string_ptr("UNIONTYPE");
}

SQLDataType_list_ptr SQLUnionDataType::getItems()
{
  return items;
}

void SQLUnionDataType::add(SQLDataType_ptr item)
{
  if (item != nullptr)
  {
    item->setParent(SharedObject(SQLUnionDataType));
  }
  items->push_back(item);
}

// @Override
void SQLUnionDataType::accept0(SQLASTVisitor_ptr visitor)
{
  if (visitor->visit(SharedObject(SQLUnionDataType)))
  {
    SQLObject_list_ptr tmp = ListTran::tran_class<SQLDataType, SQLObject>(items);
    acceptChild(visitor, tmp);
  }
  visitor->endVisit(SharedObject(SQLUnionDataType));
}

SQLObject_ptr SQLUnionDataType::clone()
{

  SQLObject_ptr clone_tmp = std::shared_ptr<SQLUnionDataType>(new SQLUnionDataType());
  std::shared_ptr<SQLUnionDataType> x = std::dynamic_pointer_cast<SQLUnionDataType>(clone_tmp);
  // SQLUnionDataType x = new SQLUnionDataType();

  for (SQLDataType_ptr item : *items)
  {
    x->add(std::dynamic_pointer_cast<SQLDataType>(item->clone()));
  }

  return x;
}
